<?php

namespace Kylin\Excel\Traits;

use BadMethodCallException;

/**
 * 委托宏特性
 * 
 * 扩展Laravel的Macroable特性，支持动态方法调用
 * 允许在运行时为类添加自定义方法
 */
trait DelegatedMacroable
{
    use \Illuminate\Support\Traits\Macroable {
        __call as macroCall;
    }

    /**
     * 动态方法调用
     * 
     * 当调用不存在的方法时，首先检查是否为已注册的宏方法
     * 如果是宏方法则执行宏调用，否则抛出异常
     * 
     * @param string $method 方法名
     * @param array $parameters 方法参数
     * @return mixed 方法返回值
     * @throws BadMethodCallException 如果方法不存在且不是宏方法
     */
    public function __call(string $method, array $parameters): mixed
    {
        if (static::hasMacro($method)) {
            return $this->macroCall($method, $parameters);
        }

        throw new BadMethodCallException(
            sprintf('方法 %s::%s 不存在', static::class, $method)
        );
    }
}
