package php.runtime.ext.core.classes; import php.runtime.Memory; import php.runtime.annotation.Reflection; import php.runtime.annotation.Reflection.Arg; import php.runtime.annotation.Reflection.Name; import php.runtime.annotation.Reflection.Signature; import php.runtime.env.*; import php.runtime.env.Package; import php.runtime.ext.CoreExtension; import php.runtime.invoke.DynamicMethodInvoker; import php.runtime.invoke.Invoker; import php.runtime.lang.BaseObject; import php.runtime.memory.ArrayMemory; import php.runtime.memory.StringMemory; import php.runtime.reflection.ClassEntity; import php.runtime.reflection.ModuleEntity; @Name("php\\lang\\PackageLoader") abstract public class WrapPackageLoader extends BaseObject { protected PackageLoader loader; public WrapPackageLoader(Environment env, ClassEntity clazz) { super(env, clazz); } @Signature public void __construct() { } @Signature({@Arg("name")}) abstract public Memory load(Environment env, Memory... args) throws Throwable; @Signature public void register(Environment env) { if (loader == null) { env.getPackageManager().registerLoader(_getPackageLoader(env)); } else { env.exception("PackageLoader is already registered"); } } @Signature public void unregister(Environment env) { if (loader == null) { env.exception("PackageLoader is not registered"); } env.getPackageManager().unregisterLoader(loader); loader = null; } synchronized protected PackageLoader _getPackageLoader(final Environment env) { if (loader == null) { final Invoker invoker = DynamicMethodInvoker.valueOf(env, env.trace(), this, "load"); loader = new PackageLoader() { @Override public Package load(String name, TraceInfo trace) { if (invoker == null) { env.error(trace, "Cannot call load() method of packageLoader"); return null; } //invoker.setTrace(trace); //invoker.setPushCallTrace(true); Memory ret = invoker.callNoThrow(StringMemory.valueOf(name)); if (ret.isNull()) { return null; } if (ret.instanceOf(WrapPackage.class)) { return ret.toObject(WrapPackage.class).getPackage(); } env.error(trace, getReflection().getName() + "::load() method must return an instance of php\\lang\\Package"); return null; } }; } return loader; } }