package android

import (
	"github.com/google/blueprint"
	"github.com/google/blueprint/proptools"
)

type ModuleProxy struct {
	module blueprint.ModuleProxy
}

func (m ModuleProxy) Name() string {
	return m.module.Name()
}

func (m ModuleProxy) GenerateBuildActions(context blueprint.ModuleContext) {
	m.module.GenerateBuildActions(context)
}

func (m ModuleProxy) GenerateAndroidBuildActions(context ModuleContext) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ComponentDepsMutator(ctx BottomUpMutatorContext) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) DepsMutator(context BottomUpMutatorContext) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) base() *ModuleBase {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Disable() {

	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Enabled(ctx ConfigurableEvaluatorContext) bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Target() Target {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) MultiTargets() []Target {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ImageVariation() blueprint.Variation {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) Owner() string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInData() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInTestcases() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInSanitizerDir() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInRamdisk() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInVendorRamdisk() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInDebugRamdisk() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInRecovery() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInRoot() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInOdm() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInProduct() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInVendor() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallInSystemExt() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) InstallForceOS() (*OsType, *ArchType) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) PartitionTag(d DeviceConfig) string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) HideFromMake() {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) IsHideFromMake() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) IsSkipInstall() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) MakeUninstallable() {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ReplacedByPrebuilt() {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) IsReplacedByPrebuilt() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ExportedToMake() bool {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) EffectiveLicenseKinds() []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) EffectiveLicenseFiles() Paths {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) AddProperties(props ...interface{}) {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) GetProperties() []interface{} {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) BuildParamsForTests() []BuildParams {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) VariablesForTests() map[string]string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) String() string {
	return m.module.Name()
}

func (m ModuleProxy) qualifiedModuleId(ctx BaseModuleContext) qualifiedModuleName {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) visibilityProperties() []visibilityProperty {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) RequiredModuleNames(ctx ConfigurableEvaluatorContext) []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) HostRequiredModuleNames() []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) TargetRequiredModuleNames() []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) VintfFragmentModuleNames(ctx ConfigurableEvaluatorContext) []string {
	panic("method is not implemented on ModuleProxy")
}

func (m ModuleProxy) ConfigurableEvaluator(ctx ConfigurableEvaluatorContext) proptools.ConfigurableEvaluator {
	panic("method is not implemented on ModuleProxy")
}
