implemented rest of IEffect and it's related interfaces
no longer refers Effect instance directly (instead use IEffect interface)