1999-08-25  brian moseley  <ix@maz.org>

	VERSION 0.08:

	* Cfg/Cfg.pm (new): allow this class to be instantiated. merge a
	hashref of options.
	(get): hide the goofy namespacing
	(PlatypusSessionLevels): remove this directive now that we dont
	use Apache::Session::Tree
	(config): replaced by constructor

	* Cfg/Makefile.PL: remove PlatypusSessionLevels

	* Platypus/Application.pm (new): accept application options
	(handle_request): delegate config creation to factory. use config
	get method. handle HEAD reqeusts.
	(config): remove
	(opts): add ivar for configuration options

	* Platypus/Component.pm (link): escape uri components
	(self_link): escape uri components

	* Platypus/FileSssion.pm: implement with Apache::Session::File
	instead of Apache::Session::Tree.

	* Platypus/ObjectFactory.pm: use config get method.
	(_wrap_component): only wrap the script with 'sub output' if the
	script didnt already include it.

	* Platypus/Response.pm: allow content_type to be set. default it
	to "text/plain".

	* Platypus/SessionManager.pm (construct_url): turn relative urls
	into absolute urls by prepending the current location
	(extract_id): set empty string in path_info if it originally only
	contained a session id

1999-08-20  brian moseley  <ix@maz.org>

	* Platypus/Application.pm (handle_request): only try to save the
	session if it exists - solves problems when session restoration or
	creation dies.

	* Platypus/ObjectFactory.pm (create_component): cache components
	by package, not by uri, since the uri contains the path_info which
	may be different for every invocation of the same script.

	* Platypus/SessionManager.pm (construct_url): clean path_info out
	of the script_name before using it as a self-referencing uri
	(extract_id): correctly set new path_info after extracting
	id. also set new uri.

	VERSION 0.07:

	* Cfg/Cfg.pm: (PlatypusAuthenRequire): add
	(PlatypusHandlerReload): rename to PlatypusComponentReload

	* Cfg/Makefile.PL:
	(PlatypusAuthenRequire): should platypus perform native
	authentication?

	* Platypus/Application.pm (handle_request): if a session id is
	present in the request, restore its session. otherwise, if
	authentication is required, authenticate any credentials present
	in the request; if that fails, return a challenge to the
	user. create a new session on successful authentication. also,
	replace the three component action methods with a single
	method. this makes component scripts look lots more like
	Apache::Registry scripts and narrows the learning curve quite a
	bit. in the future we can revisit component architecture.

	* Platypus/Authenticator.pm: base class for challenging the user
	for credentials and authenticating them. base class'
	authentication always returns true to force subclassing.

	* Platypus/Component.pm (link, self_link): delegate to session
	manager for url construction
	(output): combine the 3 action methods into one

	* Platypus/NullSession.pm: a session subclass that doesn't do
	anything. useful if you want to be able store stuff in a session
	object within a single request cycle but dont want to store the
	session anywhere. save doesnt do anything. will be more
	interesting in future component architectures.

	* Platypus/ObjectFactory.pm (create_authenticator): add
	(create_session): if the configured session method is 'none', use
	NullSession class.

	* Platypus/SessionManager.pm (construct_url): allow for
	nonexistent ids, like with NullSession.
	(create_session): only create new sessions.
	(restore_session): explicit method for restoring an existing
	session.

	VERSION 0.06:

	* Cfg/Cfg.pm (PlatypusSessionBase): add
	(PlatypusSessionLevels): add
	(PlatypusSessionMethod): add

	* Cfg/Makefile.PL: add config directives for session management
	(PlatypusSessionBase): base directory for file-based session store
	(PlatypusSessionLevels): the number of levels of the directory
	tree for file-based session store
	(PlatypusSessionMethod): specify session management method - File
	or Memory

	* Platypus/Application.pm (new): remove session store, no longer
	necessary with Apache::Session. add session manager.
	(handle_request): set application for context. session manager
	restores and saves sessions. remove wack LF from end of $@ when
	handling exceptions. abort and cleanup_error now return a HTTP
	status code.
	(session_manager): add ivar

	* Platypus/Context.pm (application): add ivar
	(log): delegate to application
	(session_manager): delegate to application

	* Platypus/FileSession.pm: file-based session management, uses
	Apache::Session::Tree.

	* Platypus/MemorySession.pm: memory-based session management, uses
	Apache::Session::SingleThread.

	* Platypus/ObjectFactory.pm (create_session): create a session
	subclass, perhaps with the help of some configuration. default to
	file-based session management.
	(create_session_manager): add

	* Platypus/Request.pm (extract_id): session manager does this
	now

	* Platypus/Session.pm: becomes a base class. sets up a hashref
	ivar named '_dictionary' and expects the init method to set up
	another ivar named '_impl'.
	(destroy): remove the session from the session store
	(save): save any changed state to the session store

	* Platypus/SessionManager.pm: manage interactions with the session
	layer. responsible for managing session recognition between
	requests by extracting session ids from requests and by
	constructing urls with embedded session ids.

	* Platypus/SessionStore.pm: removed, no longer necessary with
	Apache::Session.

	VERSION 0.05:

	* Platypus/Application.pm (config): add method to retrieve
	and merge configuration data
	(handle_request): use new config method

	* Platypus/HTMLResponse.pm (as_string): add method to retrieve a
	string version of the response

	* Platypus/ObjectFactory.pm (create_component): if HandlerReload
	config is set, recompile the component if its changed on disk
	since the last time it was compiled

	* Platypus/Response.pm (as_string): add method to retrieve a
	string version of the response

1999-08-15  brian moseley  <ix@maz.org>

	VERSION 0.04:

	* Platypus/Application.pm: move all the factory methods into
	Platypus::ObjectFactory
	(new): create session store with the factory
	(init): create the app's factory
	(handle_request): create context, request, response, component with
	the app's factory. lose the notion of request handlers. instead,
	just get a new component from the factory every time and call the
	handling methods on it directly.
	(factory): add
	(mk_context): remove
	(mk_handler): remove
	(mk_request): remove
	(mk_response): remove
	(mk_session): remove
	(mk_session_store): remove
	(restore_session): create session with the app's factory
	(_handler): remove

	* Platypus/Component.pm (new): add initializer
	(init): add

	* Platypus/Response.pm (prepend_to_response): self explanatory

	* Platypus/ObjectFactory.pm: new class for creating the various
	objects used in Platypus. meant to be subclassed.

	VERSION 0.03:

	* many places: stylistic cleanups

	* Platypus/Application.pm (new): use server log as log ivar
	(handle_request): get directory configuration object and do some
	pre-handler checks. get rid of explicit component config object;
	its implicit in the new component structure. get rid of the
	rc-style exception handling which was previously necessary. create
	global context object and load it up with per-request objects.
	(checkup): move these checks out of Apache::PerlRun. check for
	Options ExecCGI and executable bit if PlatypusCompileCheck config
	directive is On.
	(mk_config): remove
	(mk_context): add
	(mk_handler): replace req argument with con
	(mk_response): replace req argument with con
	(mk_session): replace log argument with con
	(mk_session_store): remove log argument
	(restore_session): replace req argument with con
	(save_session): replace ses and log arguments with con

	* Playtpus/HTMLResponse.pm (new): remove log argument
	(respond): remove log argument

	* Platypus/RequestHandler.pm (new): replace req argument with
	con. remove can_compile step, as its now checked earlier, in
	Application. dont bother catching exceptions except for when
	compiling; die with the correct error message in that case. create
	component object after compiling component class.
	(can_compile): remove
	(create_component): add
	(generate_output): delegate to the component
	(namespace): all components go in the Platypus::Component
	namespace, with no virtual host component
	(perform_action): delegate to the component
	(sub_wrap): remove unneeded mark_line. compile component code into
	subclasses of Platypus::Component.
	(take_values): delegate to the component

	* Platypus/Cfg: add two new configuration directives -
	PlatypusCompileCheck, PlatypusHandlerReload

	* Platypus/Component.pm: new base class for components. rather
	than having components cripts provid named subs to be eval'd by
	the request handler, we have them provide methods that override
	methods in Platypus::Component.

	* Platypus/Context.pm: new class that is used as the method of
	passing global and request-time information around between other
	objects. created by the Application, goes out of scope at the end
	of it's request handling method.

	* Platypus/Util.pm (extract_event): bah throw this away. this
	should be component or application specific.
	
1999-08-14  brian moseley  <ix@maz.org>

	* Platypus/Application.pm (handle_request): create log object and
	pass it around where important
	(mk_config): log argument
	(mk_response): log argument
	(mk_session): log argument
	(mk_sesssion_store): log argument
	(restore_session): debug restoration and creation events
	(save_session): debug save event

	* Platypus/HTMLResponse.pm (init): log argument. use accessor
	methods to set ivars.
	(append_to_title): new method that appends a given string to the
	existing title, if any, separating them with the title separator
	ivar
	(author): author ivar - should be an email address
	(head): only print header tags corresponding to existing ivars -
	title, author.
	(respond): log argument
	(title_separator): new ivar, used to separate title components

	* Platypus/Response.pm (new): pass arguments through to init()
	(append_to_content): accept scalar refs, array refs and scalars

1999-08-10  brian moseley  <ix@maz.org>

	* initial import of Platypus, yet another web application
	framework. enough functionality on which to base a simple
	application.