public void Intercept(IInvocation invocation)
        {
            var methodName = invocation.Method.Name;
            var target     = invocation.InvocationTarget ?? invocation.Proxy;

            // NOTE: _isEditing 의 값 설정 연산의 순서가 상당히 중요하다. 항상 먼저 해주어야 한다.
            switch (methodName)
            {
            case @"BeginEdit":
                _isEditing = true;
                return;

            case @"CancelEdit":
                _isEditing = false;
                _propertyTempValues.Clear();
                return;

            case @"EndEdit":
                _isEditing = false;
                AssignValues(target);
                _propertyTempValues.Clear();
                return;
            }

            if (_isEditing == false)
            {
                invocation.Proceed();
                return;
            }

            var isSetProperty = methodName.StartsWith("set_", StringComparison.Ordinal);
            var isGetProperty = methodName.StartsWith("get_", StringComparison.Ordinal);

            //  Proxied 객체의 메소드에 대해서는 처리할 필요가 없다.
            //
            if (isSetProperty == false && isGetProperty == false)
            {
                return;
            }

            var propertyName = methodName.Substring(4);

            if (isSetProperty)
            {
                if (IsDebugEnabled)
                {
                    log.Debug("편집된 속성 값을 보관합니다. propertyName=[{0}], value=[{1}]", propertyName, invocation.Arguments[0]);
                }

                _propertyTempValues.AddValue(propertyName, invocation.Arguments[0]);
            }
            else
            {
                if (IsDebugEnabled)
                {
                    log.Debug("속성 값을 반환합니다. 편집된 값이 있다면 편집된 값을 반환하고, 아니면, 원본 객체의 값을 반환합니다.");
                }

                if (_propertyTempValues.ContainsKey(propertyName))
                {
                    invocation.ReturnValue = _propertyTempValues[propertyName];
                }
                else
                {
                    invocation.Proceed();
                }
            }
        }