From 0c0830ac116a1c85e2db12917d655fcaf34ddf54 Mon Sep 17 00:00:00 2001 From: Eric Date: Wed, 12 Sep 2012 16:17:45 -0500 Subject: suport a general 'logic' provider as the base of a plugin system --- src/rcl_provider.erl | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/rcl_provider.erl diff --git a/src/rcl_provider.erl b/src/rcl_provider.erl new file mode 100644 index 0000000..5c73075 --- /dev/null +++ b/src/rcl_provider.erl @@ -0,0 +1,59 @@ +%%%------------------------------------------------------------------- +%%% @author Eric Merritt +%%% @copyright 2011 Erlware, LLC. +%%% @doc +%%% A module that supports providing state manipulation services to the system. +%%% @end +%%%------------------------------------------------------------------- +-module(rcl_provider). + +%% API +-export([new/2, do/2, format/1]). + +-export_type([t/0]). + +%%%=================================================================== +%%% Types +%%%=================================================================== + +-opaque t() :: {?MODULE, module()}. + +-callback init(rcl_state:t()) -> {ok, rcl_state:t()} | {error, Reason::term()}. +-callback do(rcl_state:t()) -> {error, Reason::term()} | {ok, rcl_state:t()}. +-callback format({error, Reason::term()}) -> iolist(). + +%%%=================================================================== +%%% API +%%%=================================================================== + +%% @doc create a new provider object from the specified module. The +%% module should implement the provider behaviour. +%% +%% @param ModuleName The module name. +%% @param State0 The current state of the system +-spec new(module(), rcl_state:t()) -> {t(), {ok, rcl_state:t()} | {error, Reason::term()}}. +new(ModuleName, State0) when is_atom(ModuleName) -> + State1 = ModuleName:init(State0), + case code:which(ModuleName) of + non_existing -> + erlang:error({non_existing, ModuleName}); + _ -> + ok + end, + {{?MODULE, ModuleName}, State1}. + +%% @doc Manipulate the state of the system, that new state +%% +%% @param Provider the provider object +%% @param State the current state of the system +-spec do(Provider::t(), rcl_state:t()) -> rcl_state:t(). +do({?MODULE, Mod}, State) -> + Mod:do(State). + +%% @doc print the provider module name +%% +%% @param T - The provider +%% @return An iolist describing the provider +-spec format(t()) -> iolist(). +format({?MODULE, Mod}) -> + erlang:atom_to_list(Mod). -- cgit v1.2.3