# src/AutoShader.js

    import invariant from "invariant";
    import isPlainObject from "lodash.isplainobject";

    import StateType from "./StateType";
    import noParentStateErrorMsg from "./noParentStateErrorMsg";
    import PropertyFactoryShader from "./PropertyFactoryShader";

    /**
    	Simplified shader used by `Shader` for handling auto-shadowing.

    	@see {@link Shader}.
     */
    export default class AutoShader {
    	constructor(readonly) {
    		this.readonly = readonly;
    	}

    	shaderFor(name, state) {
    		return this;
    	}

    	shadowProperty(time, name, parentState, parentImpl, store) {
    		invariant(parentState, noParentStateErrorMsg(name, parentImpl));
    		invariant(parentImpl, "Auto shader properties must have a parent property");

    		const state = parentState[name];
    		const parentProperty = parentImpl.property();
    		var PropertyClass;

    		if (Array.isArray(state)) {
    			PropertyClass = require("./ArrayProperty").default;
    		} else if (isPlainObject(state)) {
    			PropertyClass = require("./MapProperty").default;
    		} else {
    			PropertyClass = require("./PrimitiveProperty").default;
    		}

    		const stateType = new StateType().propertyClass(PropertyClass);

    		if (this.readonly) {
    			stateType.readonly;
    		}

    		const shader = new PropertyFactoryShader(stateType, parentProperty);

    		return shader.shadowProperty(time, name, parentState, parentImpl);
    	}

    	shouldAutomount() {
    		return this.automount;
    	}
    }