public static function create($value)
    {
        if ($value instanceof \Exception) {
            return new Failure($value);
        }
        try {
            if ($value instanceof \Closure) {
                //test to ensure function doesn't throw exception or is an Exception
                $potentialException = $value();
                if ($potentialException instanceof \Exception) {
                    return new Failure($potentialException);
                }
            } elseif ($value instanceof Monadic) {
                return static::create($value->flatten());
            }

            return new Success($value);

        } catch (\Exception $e) {
            return new Failure($e);
        }
    }