% Conflict Resolver <noconflict.sty>
% Resolves Macro Name Conflict among Packages
% Copyright 2013 M. Zahid Hossain
%
% This package resolves macro name conflict among packages with concise 
% approaches and user-friendly syntaxes.
%
% This program may be distributed and/or modified under the conditions 
% of the LaTeX Project Public License, either version 1.2 of this 
% license or (at your option) any later version.
%
% A macro name can be defined by many packages. In LaTeX, macro name need 
% to be unique for a document and thus using the packages with same macro 
% name causes conflict among them. In order to avoid macro name conflict 
% this package defines several commands to save, restore and rename macros 
% defined by other packages.
%
% PACKAGE COMMANDS
% ================
%
% \prefix{<prefix added to the macro name>}
% \save{<prefix added to the macro name>}
%      {<comma separated list of macro name>}
% \save*{<comma separated list of macro name>}
% \restore{<prefix added to the macro name>}
% \restore*
% \reinstate{<prefix added to the macro name>}
%           {<comma separated partial list of macro name>}
% \rename{<old name>}{<new name>}
%
% USAGE EXAMPLE
% =============
%
% If package A, B and C define three macro names X, Y and Z. To avoid macro 
% name conflict:
%
% \usepackage{noconflict}
% \usepackage{A}
% \prefix{First} is optional
% \save{X,Y,Z}
%
% \usepackage{B}
% \save{Second}{X,Y,Z}
% The above line can also be written as: \prefix{Second} and \save*{X,Y,Z}
%
% \usepackage{C}
% \save{Third}{X,Y,Z}
%
% Now macro X, Y and Z of
% Package A: \FirstX, \FirstY, \FirstZ
% Package B: \SecondX, \SecondY, \SecondZ
% Package C: \ThirdX, \ThirdY, \ThirdZ
%
% \restore{First}
% Macros \FirstX, \FirstY and \FirstZ become \X, \Y and \Z
% \restore{Second}
% The above line can also be written as: \prefix{Second} and \restore*
% The above line can also be written as: \reinstate{Second}{X,Y,Z}
% Macros \SecondX, \SecondY and \SecondZ become \X, \Y and \Z
% \restore{Third}
% Macros \ThirdX, \ThirdY and \ThirdZ become \X, \Y and \Z
% \rename{X}{CofX}
% Macro \X becomes \CofX
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\NeedsTeXFormat{LaTeX2e} \ProvidesPackage{noconflict}[2013/04/23
v1.0 Resolves macro name conflict]


\def\@foreach#1#2{%
  \@test@foreach{#1}#2,\@end@token%
}

\def\@swallow#1{}

\def\@test@foreach#1{%
  \@ifnextchar\@end@token%
    {\@swallow}%
    {\@body@foreach{#1}}%
}

\def\@body@foreach#1#2,#3\@end@token{%
  #1{#2}%
  \@test@foreach{#1}#3\@end@token%
}

\newcommand{\@save}[1]{%
  \expandafter\global\expandafter\let\csname \@prefix#1\expandafter\endcsname%
  \csname #1\endcsname
  \expandafter\let\csname #1\endcsname\relax
}

\newcommand{\@restore}[1]{%
  \expandafter\global\expandafter\let\csname#1\expandafter\endcsname%
  \csname \@prefix#1\endcsname%
}

\newcommand{\@prefix}{First}

\newcommand{\prefix}[1]{%
  \gdef\@prefix{#1}%
}

\newcommand{\save}{\@ifstar
  \save@star%
  \save@nostar%
}

\newcommand{\save@star}[1]{
  \expandafter\gdef\csname list@conflict\@prefix\endcsname{#1}%
  \@foreach{\@save}{#1}%
}

\newcommand{\save@nostar}[2]{
  \prefix{#1}
  \expandafter\gdef\csname list@conflict\@prefix\endcsname{#2}%
  \@foreach{\@save}{#2}%
}

\newcommand{\restore}{\@ifstar
  \restore@star%
  \restore@nostar%
}

\newcommand{\restore@star}{
  \edef\expand@command{\csname list@conflict\@prefix\endcsname}%
  \expandafter\@foreach\expandafter{\expandafter\@restore\expandafter}%
  \expandafter{\expand@command}%
}

\newcommand{\restore@nostar}[1]{
  \prefix{#1}
  \edef\expand@command{\csname list@conflict\@prefix\endcsname}%
  \expandafter\@foreach\expandafter{\expandafter\@restore\expandafter}%
  \expandafter{\expand@command}%
}

\newcommand{\reinstate}[2]{
  \prefix{#1}
  \@foreach{\@restore}{#2}%
}

\newcommand{\rename}[2]{
  \expandafter\global\expandafter\let\csname #2\expandafter\endcsname%
  \csname #1\endcsname
  \expandafter\let\csname #1\endcsname\relax
}

\endinput


